﻿/*!
 *  @brief      创建UdpSocket - 广播
 *  @details    广播模式（broadcast）：一个UDP客户端发出的数据报，在同一网络范围内其他所有的UDP客户端都可以收到。
 *  @author     YZG
 *  @version    v 1.0.0.1
 *  @date       2019-05-22
 *  @warning
 *  @copyright
 *  @note  QUdpSocket支持IPv4广播。 需要在数据报中指定接收端地址为QHostAddress::Broadcast，一般的广播地址是255.255.255.255。
 */

#ifndef UDPBROADCAST_H
#define UDPBROADCAST_H

#include "common_global.h"

#include <QObject>
#include <QAbstractSocket>
#include <QUdpSocket>

namespace Common {

	class COMMONSHARED_EXPORT UdpBroadcast : public QObject
	{
		Q_OBJECT
	public:
		explicit UdpBroadcast(QObject *parent = nullptr);
		~UdpBroadcast();

	public:
		/**
		 * @brief getUdpSocket
		 * @return
		 */
		QUdpSocket * getUdpSocket();

		/**
		 * @brief createUdp 创建UDP
		 * @param port 本地端口
		 * @param broadcast 是否广播
		 * @return
		 */
		bool createBroadcast(int port);

		/**
		 * @brief closeBroadcast 关闭UDP
		 * @return
		 */
		bool closeBroadcast();

		/**
		 * @brief sendToBroadcastMsg 发生消息
		 * @param targetPort 目标端口
		 * @param buff
		 * @return
		 */
		bool sendToBroadcastMsg(int targetPort, QByteArray buff);

	signals:
		/**
		 * @brief signalRecvMsg 触发组播的接收的消息
		 * @param sourceIp
		 * @param sourcePort
		 * @param recvMsg
		 */
		void signalRecvMsg(QString sourceIp, int sourcePort, QByteArray recvMsg);

		public slots:
		/**
		 * @brief slotBroadcastReadyRead 读取数据
		 */
		void slotBroadcastReadyRead();

		/**
		 * @brief slotSocketStateChange 网络状态信息改变
		 * @param state
		 */
		void slotSocketStateChange(QAbstractSocket::SocketState state);

	private:
		QUdpSocket *m_pUdpSocket;       // 单播模式
		bool m_bBind;                   // 是否绑定成功
	};

}//namespace Common

#endif // UDPBROADCAST_H
